﻿using System.ComponentModel.DataAnnotations;
using System.Net.Mail;
using Fadada.FASC.SDK.DotNetCore.Attributes;
using Newtonsoft.Json;

namespace Fadada.FASC.SDK.DotNetCore.Model
{
    [RemoteService("/sign-task/create", "POST")]
    public class SignTaskCreate
    {
        /// <summary>
        /// 签署任务主题。长度最大100个字符。
        /// 其他参与方在收到的通知和打开的页面上都可以醒目地看到该主题，并可作为各参与方管理和检索的关键标题，因此该参数非常重要，请认真编写。
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "signTaskSubject", Required = Required.Always)]
        [MaxLength(100)]
        public string SignTaskSubject { get; set; }

        /// <summary>
        /// 该签署任务的发起方。特别注意授权要求：只有经过该发起方授权后，才可以将该发起方填写到此参数中并发起签署任务。
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "initiator", Required = Required.Always)]
        public OpenId Initiator { get; set; }

        /// <summary>
        /// 任务过期时间。在此时间之后，该签署任务将自动终结。在自动终结时，如果所有签署方都签署完毕，则任务自动正常结束，否则任务将逾期作废。不传该参数时默认为90天。
        /// 格式为：Unix标准时间戳，精确到毫秒。该参数时间是未来时间，且和当前时间差不可小于10分钟(600000) 。
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "expiresTime", Required = Required.AllowNull)]
        public string ExpiresTime { get; set; }

        /// <summary>
        /// 是否自动发起。
        /// false: 不自动发起
        /// true: 自动发起
        /// 默认为false。注意：如果设置为true，则必须设置相关文档和参与方等必备要素。
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "autoInitiate", Required = Required.AllowNull)]
        public bool AutoInitiate { get; set; } = false;

        /// <summary>
        /// 如果签署任务中定义了填写参与方，在填写流程中，全部必填控件填写完成后是否自动定稿：
        /// false: 不自动定稿
        /// true: 自动定稿
        /// 默认为true。定稿之后就不允许任何参与方再填写或修改文档内容了，在填写流程结束后会自动将所填写内容合成到PDF文档中固化下来，并自动进入签署流程环节。
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "autoFillFinalize", Required = Required.AllowNull)]
        public bool AutoFillFinalize { get; set; } = true;

        /// <summary>
        /// 所有签署方签署完成后，签署任务是否自动结束：
        /// false: 不自动结束
        /// true: 自动结束
        /// 默认为true。结束后的签署任务将不可进行任何变动，并将生成签署完成的签名/签章文件(如合同)。
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "autoFinish", Required = Required.AllowNull)]
        public bool AutoFinish { get; set; } = true;

        /// <summary>
        /// 填写流程是否有序：
        /// false: 无序
        /// true: 有序
        /// 默认为false。“无序”意味着所有填写参与方将并行收到填写通知(如果要求通知的话)并可填写；“有序”意味着轮到的填写参与方才会收到填写通知(如果要求通知的话)并可填写。
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "fillInOrder", Required = Required.AllowNull)]
        public bool FillInOrder { get; set; } = false;

        /// <summary>
        /// 签署流程是否有序：
        /// false: 无序
        /// true: 有序
        /// 默认为false。“无序”意味着所有签署参与方将并行收到签署通知(如果要求通知的话)并可签署；“有序”意味着轮到的签署参与方才会收到通签署知(如果要求通知的话)并可签署。
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "signInOrder", Required = Required.AllowNull)]
        public bool SignInOrder { get; set; } = false;

        /// <summary>
        /// 您的业务应用系统中的业务场景信息，用于更好地定义业务场景和签署任务的关系。
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "businessScene", Required = Required.AllowNull)]
        public BusinessScene BusinessScene { get; set; }

        /// <summary>
        /// 待签署的文档列表，文档数上限为20个。一个签署任务中可包含多份文档，请根据您的业务需要合理定义文档，例如：建议将实际的业务中的”合同“定义到一个签署任务中当做文档。需要理解的是，携带的文档数量越多，将消耗更多的系统资源，并可能影响性能。在您和法大大的商务约定中，可能有限制一个签署任务中文档的数量上限，如遇问题，请咨询您组织中的商务人员。
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "docs", Required = Required.AllowNull)]
        public Doc[] Docs { get; set; }

        /// <summary>
        /// 附件列表，附件数上限为20个。
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "attachs", Required = Required.AllowNull)]
        public Attach[] Attachs { get; set; }

        /// <summary>
        /// 填写方列表。
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "fillActors", Required = Required.AllowNull)]
        public FillActorThird[] FillActors { get; set; }

        /// <summary>
        /// 签署方列表。
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "signActors", Required = Required.AllowNull)]
        public SignActorThird[] SignActors { get; set; }

        /// <summary>
        /// 抄送方列表。
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "ccActors", Required = Required.AllowNull)]
        public CCActor[] CcActors { get; set; }
    }

}